﻿/*
  --============================================================================================
  --============================================================================================
  -- Fichier          :	SearchPV_VM.cs
  -- Objet			  :	View Model de l'écran de recherche d'un PV
  -- Auteur			  :	S. Le Gouellec
  -- Date de création : 07/2014
  --                              :
  --                              :
  -- Notes spéciales		  :
  -- Historique			  :
  ----------------------------------------------------------------------------------------------
  -- |     Code    |  Vers. |   Date   | Auteur	|                  Description
  -- |  Dem/inc/pr |  	    |          |        |         
  -- -------------------------------------------------------------------------------------------
  -- |             |   1.0  | 07/2014  |  SLE	| Création
  -- |	           |	    |	       |        |
  --============================================================================================
  --============================================================================================
*/

using MessageBox;
using ModelEntities.Adapter;
using ModelEntities.Facade;
using ReprisePV.Views;
using GeneralServices.ViewModel;
using System;
using System.Collections.Generic;
using System.Collections.ObjectModel;
using System.Linq;
using System.Windows.Input;
using System.Threading;
using System.Windows;

namespace ReprisePV.ViewModels
{
    /// <summary>
    /// ViewModel de l'écran de recherche d'un PV.
    /// </summary>
    public class SearchPV_VM :ViewModelBase
    {
        #region Attribut(s)

        /// <summary>
        /// Evenement de mise à jour du numéro de PV sur la vue
        /// </summary>
        public EventHandler<PVEventArgs> UpdateNumPV;

        #endregion

        #region Propriété(s)

        #region Command

        /// <summary>
        /// Command pour l'action de recherche
        /// </summary>
        public ICommand Search
        {
            get;
            private set;
        }

        /// <summary>
        /// Command pour le détail d'un PV
        /// </summary>
        public ICommand Detail
        {
            get;
            private set;
        }

        #endregion

        #region Liste de données

        /// <summary>
        /// Liste Observable des PVs qui est bindé par la vue
        /// </summary>
        public ObservableCollection<MEntetePV> Data
        {
            get;
            private set;
        }

        /// <summary>
        /// Liste Observable des années qui est bindé par la vue
        /// </summary>
        public ObservableCollection<String> Years
        {
            get;
            private set;
        }

        #endregion

        #region Utils
        #endregion

        #endregion

        #region Constructeur(s)

        /// <summary>
        /// Constructeur vide
        /// </summary>
        public SearchPV_VM()
        {
            /** List Observable pour la vue **/
            Data = new ObservableCollection<MEntetePV>();

            // Affectation des années
            Years = new ObservableCollection<String>(FacadePV.Instance.GetYears());
            Years.Insert(0, String.Empty);

            /** COMMAND **/
            Search = new RelayCommand(ExSearch, CanExSearch);
            Detail = new RelayCommand(ExDetail, CanExDetail);

            FacadePV.Instance.UpdatePVs += UpdatePVAfterRemove;
        }

        #endregion

        #region Méthode(s)

        #region Evenement Search

        /// <summary>
        /// 
        /// </summary>
        /// <param name="obj"></param>
        private void ExSearch(object obj)
        {
            object[] tabArg = ConvertParamSearch(obj);

            String numPVSaisi = Convert.ToString(tabArg[0]);
            String cbAnneSaisi = Convert.ToString(tabArg[1]);

            FacadePV facade = FacadePV.Instance;

            // - Si l'utilisateur a renseigné juste le champ Date
            // - Sinon 
            //      - Si l'utilisateur a renseigné que l'année : Message d'erreur
            // - Sinon prise en compte des deux critères : Date + Numéro du PV
            if (!numPVSaisi.Equals(String.Empty) && cbAnneSaisi.Equals(String.Empty))
                FillCollection(Data, facade.GetPVs(numPVSaisi));
            else if (!cbAnneSaisi.Equals(String.Empty) && numPVSaisi.Equals(String.Empty))
                ShowMessageBox.Show(TYPE_WINDOW_BOX.INFO, "Vous devez obligatoirement saisir un numéro de PV", "");
            else
            {
                List<MEntetePV> list = facade.GetPVs(numPVSaisi);
                list = list.Where(pv => pv.DateEdition.Year.ToString().Equals(cbAnneSaisi)).ToList();
                FillCollection(Data, list);
            }
        }

        /// <summary>
        /// 
        /// </summary>
        /// <param name="arg"></param>
        /// <returns></returns>
        private bool CanExSearch(object arg)
        {
            return true;
        }

        #endregion

        #region Evenement Detail PV

        /// <summary>
        /// 
        /// </summary>
        /// <param name="arg"></param>
        /// <returns></returns>
        private bool CanExDetail(object arg)
        {
            return true;
        }

        /// <summary>
        /// 
        /// </summary>
        /// <param name="obj"></param>
        private void ExDetail(object obj)
        {
            MEntetePV pv = obj as MEntetePV;
            if (pv != null)
            {
                DetailPV view = new DetailPV(pv);
                this.OnActionVM(new ActionVMArgs(view, "DetailsPV"));
            }
        }

        #endregion

        #region Utils

        /// <summary>
        /// Permet de convertir l'objet recu grâce au Converter
        /// </summary>
        /// <param name="value"></param>
        /// <returns>Retourne un tableau d'objet. object[0] est le numéro du PV saisi par l'utilsiateur , object[1] l'année choisi dans la combo-box</returns>
        private object[] ConvertParamSearch(object value)
        {
            object[] tab = new object[2];
            String data = System.Convert.ToString(value);
            string[] dataTab = data.Split(new string[] { " - " }, StringSplitOptions.None);

            tab[0] = dataTab[0];
            tab[1] = dataTab[1];
            return tab;
        }


        /// <summary>
        /// Permet de remplir la collection passé en paramètre avec la list
        /// </summary>
        /// <param name="Data">Collection à remplir</param>
        /// <param name="list">List d'objet retourné par une fonction</param>
        private void FillCollection(ObservableCollection<MEntetePV> Data, List<MEntetePV> list)
        {
            Data.Clear();
            foreach (MEntetePV pv in list)
                Data.Add(pv);
        }

        #endregion

        #region Rafraichissement

        private void UpdatePVAfterRemove(object sender, PVEventArgs e)
        {
            if (UpdateNumPV != null)
                UpdateNumPV(this, e);

            ExSearch(String.Format("{0} - ", e.PV.NoPV));
        }

        #endregion

        #endregion
    }
}
